<?
/**
 * 
 * GPFAction, GPFHelper, GPFAdmin 의 상위 클래스
 *
 * @author	chongmyung.park (http://byfun.com)
 */

if (!defined("GPF")) exit; // 개별 페이지 접근 불가 

include_once GPF_PATH."/lib/gpf.Config.class.php";

class GPFObject
{
	/**
	 *
	 * @var GPF 플러그인 타입 (plugin, admin, helper)
	 */
	public $type;

	/**
	 *
	 * @var object GPFConfig 인스턴스
	 */
	public $cfg;

	/**
	 * 
	 * @var array 플러그인 저장 배열
	 */
	protected $plugins = array();

	/**
	 * 생성자
	 */
	protected function __construct($type) {
		$this->type = $type;
		$this->cfg = GPFConfig::getInstance();
		$this->_loadPlugins();
	}

	/**
	 * 
	 * 플러그인 로드
	 * 
	 */
	protected function _loadPlugins()
	{
		include_once GPF_PATH."/lib/gpf.Plugin.class.php";

		$use_plugins = $this->getActivatedPlugins();
		foreach($use_plugins as $p) 
		{
			$p = $this->readPlugin($p);
			if($p) $p->regist($this);					
		}
	}

	/**
	 * 
	 * PX 추가 (GPFAction, GPFAdmin, GPFHelper 모두 PX를 사용할 수 있음)
	 *
	 * @param string $event 이벤트명
	 * @param obj $obj {@link GPFPlugin} 객체
	 * @param string $handler $obj 내에 구현된 이벤트 핸들러
	 */
	public function addPx($event, $obj, $handler)
	{
		if(!defined("GPF_PX")) return false;
		include_once GPF_PATH."/lib/gpf.GPFPx.class.php";
		$px = GPFPx::getInstance();
		$px->addPx($event, $obj, $handler);
	}

	/**
	 *
	 * 활성화된 플러그인 목록 반환
	 *
	 */
	public function getActivatedPlugins()
	{
		$usings = "using_".$this->type."s";
		return $this->cfg->$usings;
	}


	/**
	 *
	 * 모든 플러그인 정보 반환 (사용되지 않는 플러그인 포함)
	 */
	public function readPluginInfos()
	{
		include_once GPF_PATH."/lib/gpf.PluginInfo.class.php";
		$path = GPF_PATH."/".$this->type;
		$plugins = array();

		// 플러그인 로드
		$d = dir($path);
		while ($entry = $d->read()) {	
			if(substr($entry, 0, 1) == ".") continue;
			$p = $this->readPluginInfo($entry);
			if($p) $plugins[$p->id] = $p;				
		} // while	

		return $this->_sort_plugins($plugins);
	}

	/**
	 *
	 * 플러그인 정보 반환
	 */
	public function readPluginInfo($plugin_id)
	{
		include_once GPF_PATH."/lib/gpf.PluginInfo.class.php";
		$classFile = GPF_PATH."/".$this->type."/".$plugin_id."/info.php";
		$realClassName = "GPFPluginInfo".ucfirst($plugin_id);
		include_once $classFile;			
		if(class_exists($realClassName)) {
			$p = new $realClassName();
			if(!is_a($p, "GPFPluginInfo")) return null;
			return $p;
		}			
		return null;
	}

	/**
	 *
	 * 모든 플러그인 반환 (사용되지 않는 플러그인 포함)
	 */
	public function readPlugins()
	{
		$path = GPF_PATH."/".$this->type;
		$plugins = array();

		// 플러그인 로드
		$d = dir($path);
		while ($entry = $d->read()) {				
			if(substr($entry, 0, 1) == ".") continue;
			$p = $this->readPlugin($entry);
			if($p) $plugins[$p->id] = $p;						
		} // while
		
		return $this->_sort_plugins($plugins);
	}

	/**
	 *
	 * 플러그인 반환
	 */
	public function readPlugin($plugin_id)
	{
		include_once GPF_PATH."/lib/gpf.Plugin.class.php";
		$classFile = GPF_PATH."/".$this->type."/".$plugin_id."/plugin.php";
		if(!file_exists($classFile)) return null;				
		$realClassName = "GPFPlugin".ucfirst($plugin_id);
		include_once $classFile;				
		if(!class_exists($realClassName)) return null;
		$p = new $realClassName();
		if(!is_a($p, "GPFPlugin")) return null;
		return $p;
	}

	/**
	 *
	 * 연관배열 키 기준으로 정렬 (asort)
	 *
	 * @param array $a 연관배열
	 * @param string $subkey 정렬기준키
	 * @return array 정렬된 배열
	 */
	function _subval_asort($a,$subkey) {
		foreach($a as $k=>$v) {
			$b[$k] = strtolower($v[$subkey]);
		}
		asort($b);
		foreach($b as $key=>$val) {
			$c[] = $a[$key];
		}
		return $c;
	}

	/**
	 *
	 * 플러그인을 plugin_order 로 정렬하여 반환
	 */
	function _sort_plugins($plugins)
	{
		return $plugins;
	}
}
?>